<?php if (!defined('INDEX')) { trigger_error("Index is not defined!", E_USER_ERROR); exit(); }
/**
 * Тут хранятся всякие - разные необходимые классы и функции для проекта. Проще говоря - бардак!
 * @package habrabookmarks
 *
 * @author       Max Kamashev <max.kamashev@floscoeli.com>
 * @copyright    floscoeli.com ©2009
 * @license      http://opensource.org/licenses/gpl-3.0.html
 * @version      SVN: $Id: functions.php 43 2009-04-05 14:33:07Z M.Kamashev $
 *
 * settings:     ts: 4 spaces, eof: lf (unix), codepage: UTF-8
 */

/**
 * Реализация функции __autoload для всех классов
 * @param string $class_name Строка с названием класса
 * @access protected Уровень доступа
 * @return void
 */
function __autoload($class_name) {
    if ( file_exists( APPPATH . '/services/' . $class_name . '.service.php' ) ) {
        require_once APPPATH . '/services/' . $class_name . '.service.php';
    } elseif ($class_name == 'Service') {
        require_once APPPATH . '/system/services.php';
    } else {
        trigger_error('Не удалось найти файл с классом ' . $class_name."\n", E_USER_ERROR);
    }
}

/**
 * Возвращает массив с доступными сервисами закладок
 * @return mixed array
 * TODO Кэшировать результат работы функции
 */
function getServices() {
    $sd = scandir( APPPATH . '/services/' );
    $services = array();
    foreach ( $sd as $file_name ) {
        $pos = strpos($file_name, '.service.php');
        if (!$pos) { continue; }

        $class_name = substr($file_name, 0, $pos);
        $services[$class_name]['filename'] = $file_name;

        if (ereg("[A-Za-z0-9]+" , $class_name)) {
            $class = new $class_name;
            $services[$class_name]['description'] = $class->description();
            $services[$class_name]['exportForm'] = $class->exportFormRender();
            $services[$class_name]['importForm'] = $class->importFormRender();
            $services[$class_name]['export'] = $class->export;
            $services[$class_name]['import'] = $class->import;
        } else {
            throw new Exception("Проблемы с классом сервиса " . $class_name, E_USER_ERROR);
        }
    }
    return $services;
}

/**
 * Функция - обработчик ПОЛЬЗОВАТЕЛЬСКИХ ошибок.
 * @param $errno integer
 * @param $errstr string
 * @param $errfile string
 * @param $errline integer
 * @return bool
 */
function UserErrorHandler($errno, $errstr, $errfile, $errline){
    //TODO Нотисы и варнинги - показывать, ерроры - не показывать, только записывать в лог
    switch ($errno) {
        case E_USER_ERROR:
            trigger_error("<b>USER ERROR</b> [$errno] $errstr<br />\n".
            "  Fatal error on line $errline in file $errfile<br />\n");
            exit(1);
            break;
        case E_USER_WARNING:
            trigger_error("<b>USER Warning</b> [$errno] $errstr<br />\n".
            "  User notice on line $errline in file $errfile<br />\n");
            break;
        case E_USER_NOTICE:
            trigger_error("<b>USER Notice</b> [$errno] $errstr<br />\n".
            "  User notice on line $errline in file $errfile<br />\n");
            break;
    }
    return true;
}
